1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2026-03-02 03:49:30 +00:00
This commit is contained in:
gnosygnu
2015-07-12 21:10:02 -04:00
commit 794b5a232f
3099 changed files with 238212 additions and 0 deletions

View File

@@ -0,0 +1,51 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.gfui; import gplx.*;
public class DataBndr_whenEvt_execCmd implements InjectAble, GfoInvkAble, GfoEvObj {
public GfoEvMgr EvMgr() {if (evMgr == null) evMgr = GfoEvMgr.new_(this); return evMgr;} GfoEvMgr evMgr;
public DataBndr_whenEvt_execCmd WhenArg_(String v) {whenArg = v; return this;} private String whenArg = "v";
public DataBndr_whenEvt_execCmd WhenEvt_(GfoEvObj whenSrc, String whenEvt) {
this.whenEvt = whenEvt;
GfoEvMgr_.SubSame(whenSrc, whenEvt, this);
return this;
}
public DataBndr_whenEvt_execCmd GetCmd_(GfoInvkAble getInvk, String getCmd) {
this.getInvk = getInvk;
this.getCmd = getCmd;
return this;
} GfoInvkAble getInvk; String getCmd;
public void Inject(Object owner) {
setInvk = GfoInvkAble_.cast_(owner);
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, whenEvt)) {
Object evtVal = m.CastObjOr(whenArg, "");
Object getVal = getInvk.Invk(GfsCtx._, 0, getCmd, GfoMsg_.new_cast_(getCmd).Add("v", evtVal));
GfoMsg setMsg = GfoMsg_.new_cast_(setCmd).Add("v", Object_.Xto_str_strict_or_empty(getVal));
setInvk.Invk(GfsCtx._, 0, setCmd, setMsg);
return GfoInvkAble_.Rv_handled;
}
else return GfoInvkAble_.Rv_unhandled;
}
String whenEvt, setCmd; GfoInvkAble setInvk;
public static DataBndr_whenEvt_execCmd text_() {
DataBndr_whenEvt_execCmd rv = new DataBndr_whenEvt_execCmd();
rv.setCmd = GfuiElemKeys.Text_set;
return rv;
}
}

View File

@@ -0,0 +1,55 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.gfui; import gplx.*;
public class GfuiBnd_box_status implements GfoInvkAble, UsrMsgWkr {
public GfuiElem Box() {return box;} GfuiElem box;
public void ExecUsrMsg(int type, UsrMsg umsg) {
box.Invoke(GfoInvkAbleCmd.arg_(this, WriteText_cmd, umsg.XtoStr()));
}
public void WriteText(String text) {
GfuiElem lastFocus = GfuiFocusMgr._.FocusedElem(); // HACK:WINFORMS:.Visible=true will automatically transfer focus to textBox; force Focus back to original
box.Text_(text);
GfuiWin ownerWin = box.OwnerWin();
if (ownerWin != null && !ownerWin.Visible()) {
ownerWin.Visible_set(true);
ownerWin.Zorder_front();
}
timer.Enabled_off(); timer.Enabled_on(); // reset time
GfuiEnv_.DoEvents(); // WORKAROUND:WIN32: needed, else text will not refresh (ex: splash screen); will cause other timers to fire! (ex: mediaPlaylistMgr)
if (lastFocus != null) lastFocus.Focus();
}
public void HideWin() {
if (box.OwnerWin() != null)
box.OwnerWin().Visible_off_();
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, WriteText_cmd)) WriteText(m.ReadStr("v"));
else if (ctx.Match(k, TimerTick_evt)) HideWin();
return this;
} static final String TimerTick_evt = "TimerTick", WriteText_cmd = "WriteText";
TimerAdp timer;
public static GfuiBnd_box_status new_(String key) {
GfuiBnd_box_status rv = new GfuiBnd_box_status();
GfuiTextBox txtBox = GfuiTextBox_.new_();
txtBox.Key_of_GfuiElem_(key);
txtBox.BackColor_(ColorAdp_.Black).ForeColor_(ColorAdp_.Green).TextAlignH_right_();
rv.box = txtBox;
rv.timer = TimerAdp.new_(rv, TimerTick_evt, 2000, false);
return rv;
}
}

View File

@@ -0,0 +1,41 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.gfui; import gplx.*;
import gplx.lists.*;
public class GfuiCheckListBox extends GfuiElemBase {
public void Items_reverse() {checkListBox.Items_reverse();}
public void Items_count() {checkListBox.Items_count();}
public void Items_setAt(int i, boolean v) {checkListBox.Items_setCheckedAt(i, v);}
public void Items_setAll(boolean v) {checkListBox.Items_setAll(v);}
public void Items_clear() {checkListBox.Items_clear();}
public void Items_add(Object item, boolean v) {checkListBox.Items_add(item, v);}
public List_adp Items_getAll() {return checkListBox.Items_getAll();}
public List_adp Items_getChecked() {return checkListBox.Items_getChecked();}
GxwCheckListBox checkListBox;
@Override public GxwElem UnderElem_make(KeyValHash ctorArgs) {return new GxwCheckListBox_lang();}
@Override public void ctor_GfuiBox_base(KeyValHash ctorArgs) {
super.ctor_GfuiBox_base(ctorArgs);
this.checkListBox = (GxwCheckListBox)UnderElem();
}
public static GfuiCheckListBox new_() {
GfuiCheckListBox rv = new GfuiCheckListBox();
rv.ctor_GfuiBox_base(GfuiElem_.init_focusAble_true_());
return rv;
}
}

View File

@@ -0,0 +1,60 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.gfui; import gplx.*;
public class GfuiCheckListPanel extends GfuiElemBase {
@Override public void ctor_GfuiBox_base(KeyValHash ctorArgs) {
super.ctor_GfuiBox_base(ctorArgs);
InitToggleWidget();
InitReverseWidget();
InitListBoxWidget();
this.Lyt_activate();
this.Lyt().Bands_add(GftBand.new_().Cell_abs_(60));
this.Lyt().Bands_add(GftBand.new_().Cell_abs_(70));
this.Lyt().Bands_add(GftBand.fillAll_());
}
public void Items_clear() {listBox.Items_clear();}
public void Items_add(Object item, boolean checkBoxState) {listBox.Items_add(item, checkBoxState);}
public List_adp Items_getAll() {return listBox.Items_getAll();}
public List_adp Items_getChecked() {return listBox.Items_getChecked();}
public void SetAllCheckStates(boolean v) {
listBox.Items_setAll(v);
}
void InitToggleWidget() {
toggle = GfuiChkBox_.invk_("toggle", this, "&toggle", this, ToggleChecks_cmd); toggle.Size_(60, 20); toggle.AlignH_set(GfuiAlign_.Left);
}
void InitReverseWidget() {
GfuiBtn_.invk_("reverse", this, this, ReverseChks_cmd).Size_(70, 20).Text_("&reverse");
}
void InitListBoxWidget() {
listBox.Owner_(this, "listBox");
}
@Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, ToggleChecks_cmd)) SetAllCheckStates(toggle.Val());
else if (ctx.Match(k, ReverseChks_cmd)) listBox.Items_reverse();
else return super.Invk(ctx, ikey, k, m);
return this;
} public static final String ToggleChecks_cmd = "ToggleChecks", ReverseChks_cmd = "ReverseChks";
GfuiChkBox toggle;
GfuiCheckListBox listBox = GfuiCheckListBox.new_();
public static GfuiCheckListPanel new_() {
GfuiCheckListPanel rv = new GfuiCheckListPanel();
rv.ctor_GfuiBox_base(GfuiElem_.init_focusAble_false_());
return rv;
}
}

View File

@@ -0,0 +1,38 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.gfui; import gplx.*;
public class GfuiFormPanel extends GfuiElemBase {
@Override public void ctor_GfuiBox_base(KeyValHash ctorArgs) {
super.ctor_GfuiBox_base(ctorArgs);
this.Width_(60); // default to 60; do not force callers to always set width
GfuiWin ownerForm = (GfuiWin)ctorArgs.FetchValOr(GfuiElem_.InitKey_ownerWin, null);
GfoFactory_gfui.Btn_MoveBox(this, ownerForm);
GfoFactory_gfui.Btn_MinWin2(this);
GfoFactory_gfui.Btn_QuitWin3(this);
this.Lyt_activate();
this.Lyt().Bands_add(GftBand.new_().Cells_num_(3));
}
public static GfuiFormPanel new_(GfuiWin form) {
GfuiFormPanel rv = new GfuiFormPanel();
rv.ctor_GfuiBox_base(GfuiElem_.init_focusAble_false_().Add(GfuiElem_.InitKey_ownerWin, form));
rv.Owner_(form, "formPanel");
return rv;
}
}

View File

@@ -0,0 +1,52 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.gfui; import gplx.*;
import java.io.File;
import java.awt.FileDialog;
import javax.swing.JFrame;
public class GfuiIoDialogUtl {
public static Io_url SelectDir() {return SelectDir(Io_url_.Empty);}
public static Io_url SelectDir(Io_url startingDir) {
FileDialog openFileDialog = NewOpenFileDialog(startingDir);
// openFileDialog.FileName = @"press enter to select this folder";
openFileDialog.setVisible(true);
String selectedDir = openFileDialog.getDirectory();
if (selectedDir == null) return Io_url_.Empty; // nothing selected
Io_url selected = Io_url_.new_any_(selectedDir);
Io_url selectedFil = selected.GenSubFil(openFileDialog.getFile());
return selectedFil.OwnerDir();
}
public static Io_url SelectFile() {return SelectFile(Io_url_.Empty);}
public static Io_url SelectFile(Io_url startingDir) {
FileDialog openFileDialog = NewOpenFileDialog(startingDir);
openFileDialog.setVisible(true);
String selectedDir = openFileDialog.getDirectory();
if (selectedDir == null) return Io_url_.Empty; // nothing selected
Io_url selected = Io_url_.new_any_(selectedDir);
Io_url selectedFil = selected.GenSubFil(openFileDialog.getFile());
return selectedFil;
}
static FileDialog NewOpenFileDialog(Io_url startingDir) {
//WORKAROUND (Windows.Forms): InitialDirectory only works for new instances; http://groups.google.com/groups?hl=en&lr=&threadm=ubk6dEUYDHA.536%40TK2MSFTNGP10.phx.gbl&rnum=30&prev=/groups%3Fq%3Ddotnet%2BInitialDirectory%26hl%3Den%26btnG%3DGoogle%2BSearch
FileDialog openFileDialog = new FileDialog(new JFrame());
if (!startingDir.EqNull())
openFileDialog.setDirectory(startingDir.Xto_api());
return openFileDialog;
}
}

View File

@@ -0,0 +1,70 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.gfui; import gplx.*;
public abstract class GfuiIoUrlSelectBox extends GfuiElemBase {
@Override public void ctor_GfuiBox_base(KeyValHash ctorArgs) {
super.ctor_GfuiBox_base(ctorArgs);
label = GfuiLbl_.sub_("label", this);
pathBox.Owner_(this, "pathBox");
GfuiBtn_.invk_("selectPath", this, this, SelectAction_cmd).Text_("...");
this.Lyt_activate();
this.Lyt().Bands_add(GftBand.new_().Cell_abs_(60).Cell_pct_(100).Cell_abs_(30));
}
public static final String PathSelected_evt = "PathSelected_evt";
public GfuiLbl Label() {return label;} GfuiLbl label;
public Io_url Url() {return Io_url_.new_any_(pathBox.TextMgr().Val());}
public Io_url StartingFolder() {return startingFolder;}
public void StartingFolder_set(Io_url v) {this.startingFolder = v;} Io_url startingFolder = Io_url_.Empty;
@Override public void Focus() {pathBox.Focus();}
void SelectAction() {
Io_url selectedPath = SelectAction_hook(this.startingFolder);
if (selectedPath.EqNull()) return;
pathBox.Text_(selectedPath.Raw());
GfoEvMgr_.Pub(this, PathSelected_evt);
}
protected abstract Io_url SelectAction_hook(Io_url startingFolder);
@Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, SelectAction_cmd)) SelectAction();
else return super.Invk(ctx, ikey, k, m);
return this;
} public static final String SelectAction_cmd = "SelectAction";
GfuiComboBox pathBox = GfuiComboBox.new_();
}
class IoFileSelector extends GfuiIoUrlSelectBox { @Override protected Io_url SelectAction_hook(Io_url startingFolder) {
return GfuiIoDialogUtl.SelectFile(startingFolder);
}
public static IoFileSelector new_() {
IoFileSelector rv = new IoFileSelector();
rv.ctor_GfuiBox_base(GfuiElem_.init_focusAble_false_());
return rv;
} IoFileSelector() {}
}
class IoFolderSelector extends GfuiIoUrlSelectBox { @Override protected Io_url SelectAction_hook(Io_url startingFolder) {
Io_url url = GfuiIoDialogUtl.SelectDir(startingFolder);
this.StartingFolder_set(url);
return url;
}
public static IoFolderSelector new_() {
IoFolderSelector rv = new IoFolderSelector();
rv.ctor_GfuiBox_base(GfuiElem_.init_focusAble_false_());
return rv;
} IoFolderSelector() {}
}

View File

@@ -0,0 +1,22 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.gfui; import gplx.*;
public class GfuiIoUrlSelectBox_ {
public static GfuiIoUrlSelectBox dir_() {return IoFolderSelector.new_();}
public static GfuiIoUrlSelectBox fil_() {return IoFileSelector.new_();}
}

View File

@@ -0,0 +1,80 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.gfui; import gplx.*;
public class GfuiMoveElemBnd implements IptBnd, GfoInvkAble, InjectAble {
public String Key() {return "gplx.gfui.moveWidget";}
public List_adp Ipts() {return args;} List_adp args = List_adp_.new_();
public IptEventType EventTypes() {return IptEventType_.add_(IptEventType_.KeyDown, IptEventType_.MouseDown, IptEventType_.MouseMove, IptEventType_.MouseUp);}
public void Exec(IptEventData iptData) {
int val = iptData.EventType().Val();
if (val == IptEventType_.KeyDown.Val()) ExecKeyDown(iptData);
else if (val == IptEventType_.MouseDown.Val()) ExecMouseDown(iptData);
else if (val == IptEventType_.MouseUp.Val()) ExecMouseUp(iptData);
else if (val == IptEventType_.MouseMove.Val()) ExecMouseMove(iptData);
}
public GfuiElem TargetElem() {return targetElem;} public void TargetElem_set(GfuiElem v) {this.targetElem = v;} GfuiElem targetElem;
public static final String target_idk = "target";
@gplx.Virtual public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, target_idk)) return targetElem;
else if (ctx.Match(k, "key")) return key;
else return GfoInvkAble_.Rv_unhandled;
}
public String Key_of_GfuiElem() {return keyIdf;} public void Key_of_GfuiElem_(String val) {keyIdf = val;} private String keyIdf = "moveElemBtnBnd";
public void Inject(Object owner) {
GfuiElem ownerElem = (GfuiElem)owner;
ownerElem.IptBnds().Add(this);
ownerElem.IptBnds().EventsToFwd_set(IptEventType_.None); // NOTE: suppress bubbling else ctrl+right will cause mediaPlayer to jump forward
}
void ExecMouseDown(IptEventData msg) {
moving = true;
anchor = msg.MousePos();
}
void ExecMouseMove(IptEventData msg) {
if (!moving) return;
targetElem.Pos_(msg.MousePos().Op_subtract(anchor).Op_add(targetElem.Pos()));
}
void ExecMouseUp(IptEventData msg) {
moving = false;
}
void ExecKeyDown(IptEventData msg) {
PointAdp current = targetElem.Pos();
PointAdp offset = PointAdp_.cast_(hash.Get_by(msg.EventArg()));
targetElem.Pos_(current.Op_add(offset));
}
@gplx.Internal protected void Key_set(String key) {this.key = key;} private String key;
public Object Srl(GfoMsg owner) {return IptBnd_.Srl(owner, this);}
boolean moving = false;
PointAdp anchor = PointAdp_.Zero; Hash_adp hash = Hash_adp_.new_();
public static GfuiMoveElemBnd new_() {return new GfuiMoveElemBnd();}
GfuiMoveElemBnd() {
args.Add_many(IptMouseBtn_.Left, IptMouseMove.AnyDirection);
IptBndArgsBldr.AddWithData(args, hash, IptKey_.Ctrl.Add(IptKey_.Up), PointAdp_.new_(0, -10));
IptBndArgsBldr.AddWithData(args, hash, IptKey_.Ctrl.Add(IptKey_.Down), PointAdp_.new_(0, 10));
IptBndArgsBldr.AddWithData(args, hash, IptKey_.Ctrl.Add(IptKey_.Left), PointAdp_.new_(-10, 0));
IptBndArgsBldr.AddWithData(args, hash, IptKey_.Ctrl.Add(IptKey_.Right), PointAdp_.new_(10, 0));
}
}
class IptBndArgsBldr {
public static void AddWithData(List_adp list, Hash_adp hash, IptArg arg, Object data) {
list.Add(arg);
hash.Add(arg, data);
}
}

View File

@@ -0,0 +1,87 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.gfui; import gplx.*;
public class GfuiMoveElemBtn extends GfuiBtn { @Override public GxwElem UnderElem_make(KeyValHash ctorArgs) {return GxwElemFactory_._.lbl_();}
@Override public void ctor_GfuiBox_base(KeyValHash ctorArgs) {
super.ctor_GfuiBox_base(ctorArgs);
this.Text_("*");
this.TipText_("move/resize");
this.IptBnds().EventsToFwd_set(IptEventType_.None);
this.IptBnds().Add(moveBinding);
this.IptBnds().Add(GfuiResizeFormBnd.new_());
}
public void TargetElem_set(GfuiElem v) {moveBinding.TargetElem_set(v);}
final GfuiMoveElemBnd moveBinding = GfuiMoveElemBnd.new_();
public static GfuiMoveElemBtn new_() {
GfuiMoveElemBtn rv = new GfuiMoveElemBtn();
rv.ctor_GfuiBox_base(GfuiElem_.init_focusAble_true_());
return rv;
}
}
class GfuiResizeFormBnd implements IptBnd {
public String Key() {return "gplx.gfui.resizeForm";}
public List_adp Ipts() {return args;} List_adp args = List_adp_.new_();
public IptEventType EventTypes() {return IptEventType_.KeyDown.Add(IptEventType_.MouseDown).Add(IptEventType_.MouseUp).Add(IptEventType_.MouseMove);}
public void Exec(IptEventData iptData) {
int val = iptData.EventType().Val();
if (val == IptEventType_.KeyDown.Val()) ExecKeyDown(iptData);
else if (val == IptEventType_.MouseDown.Val()) ExecMouseDown(iptData);
else if (val == IptEventType_.MouseUp.Val()) ExecMouseUp(iptData);
else if (val == IptEventType_.MouseMove.Val()) ExecMouseMove(iptData);
}
void ExecMouseDown(IptEventData iptData) {
active = true;
lastPos = iptData.MousePos();
}
void ExecMouseMove(IptEventData iptData) {
if (!active) return;
PointAdp delta = iptData.MousePos().Op_subtract(lastPos);
if (delta.Eq(PointAdp_.Zero)) return;
ResizeForm(iptData.Sender(), XtoSize(delta));
}
void ExecMouseUp(IptEventData iptData) {
active = false;
}
void ExecKeyDown(IptEventData iptData) {
SizeAdp deltaSize = (SizeAdp)hash.Get_by(iptData.EventArg());
ResizeForm(iptData.Sender(), deltaSize);
}
void ResizeForm(GfuiElem elem, SizeAdp deltaSize) {
GfuiWin form = elem.OwnerWin();
SizeAdp newSize = Op_add(form.Size(), deltaSize);
form.Size_(newSize);
GftGrid.LytExecRecur(form);
form.Redraw(); // must redraw, else artifacts will remain; ex: grid may leave random lines
}
static SizeAdp XtoSize(PointAdp point) {return SizeAdp_.new_(point.X(), point.Y());}
static SizeAdp Op_add(SizeAdp lhs, SizeAdp rhs) {return SizeAdp_.new_(lhs.Width() + rhs.Width(), lhs.Height() + rhs.Height());}
public Object Srl(GfoMsg owner) {return IptBnd_.Srl(owner, this);}
boolean active = false; PointAdp lastPos = PointAdp_.Zero; Hash_adp hash = Hash_adp_.new_();
public static GfuiResizeFormBnd new_() {return new GfuiResizeFormBnd();}
GfuiResizeFormBnd() {
args.Add_many(IptMouseBtn_.Right, IptMouseMove.AnyDirection);
IptBndArgsBldr.AddWithData(args, hash, IptKey_.Ctrl.Add(IptKey_.Shift).Add(IptKey_.Up), SizeAdp_.new_(0, -10));
IptBndArgsBldr.AddWithData(args, hash, IptKey_.Ctrl.Add(IptKey_.Shift).Add(IptKey_.Down), SizeAdp_.new_(0, 10));
IptBndArgsBldr.AddWithData(args, hash, IptKey_.Ctrl.Add(IptKey_.Shift).Add(IptKey_.Left), SizeAdp_.new_(-10, 0));
IptBndArgsBldr.AddWithData(args, hash, IptKey_.Ctrl.Add(IptKey_.Shift).Add(IptKey_.Right), SizeAdp_.new_(10, 0));
}
}

View File

@@ -0,0 +1,48 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.gfui; import gplx.*;
public class GfuiStatusBar extends GfuiElemBase {
public GfuiStatusBox Box() {return statusBox;} GfuiStatusBox statusBox;
public GfuiMoveElemBtn MoveButton() {return moveBtn;} GfuiMoveElemBtn moveBtn;
void StatusBar_Focus() {
statusBox.Focus_able_(true);
statusBox.Visible_set(true);
statusBox.Focus();
}
@Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, StatusBarFocus_cmd)) StatusBar_Focus();
else return super.Invk(ctx, ikey, k, m);
return this;
} public static final String StatusBarFocus_cmd = "StatusBarFocus";
@Override public void ctor_GfuiBox_base(KeyValHash ctorArgs) {
super.ctor_GfuiBox_base(ctorArgs);
moveBtn = GfuiMoveElemBtn.new_();
statusBox = GfuiStatusBox_.new_("statusBox");
statusBox.Owner_(this).Border_off_().Visible_on_();
moveBtn.Owner_(this, "moveBox");
GfoFactory_gfui.Btn_MinWin2(this);
GfoFactory_gfui.Btn_QuitWin3(this);
this.Lyt_activate();
this.Lyt().Bands_add(GftBand.new_().Cell_pct_(100).Cell_abs_(20).Cell_abs_(20).Cell_abs_(20));
}
public static GfuiStatusBar new_() {
GfuiStatusBar rv = new GfuiStatusBar();
rv.ctor_GfuiBox_base(GfuiElem_.init_focusAble_false_());
return rv;
}
}

View File

@@ -0,0 +1,28 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.gfui; import gplx.*;
public class GfuiStatusBarBnd implements InjectAble {
public GfuiStatusBar Bar() {return statusBar;} GfuiStatusBar statusBar = GfuiStatusBar.new_();
public void Inject(Object owner) {
GfuiWin form = GfuiWin_.as_(owner); if (form == null) throw Exc_.new_type_mismatch(GfuiWin.class, owner);
statusBar.Owner_(form, "statusBar");
IptBnd_.cmd_to_(IptCfg_.Null, form, statusBar, GfuiStatusBar.StatusBarFocus_cmd, IptKey_.add_(IptKey_.Ctrl, IptKey_.Alt, IptKey_.T));
statusBar.MoveButton().TargetElem_set(form);
}
public static GfuiStatusBarBnd new_() {return new GfuiStatusBarBnd();} GfuiStatusBarBnd() {}
}

View File

@@ -0,0 +1,106 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.gfui; import gplx.*;
public class GfuiStatusBox extends GfuiTextBox implements UsrMsgWkr { public GfuiStatusBox Active_(boolean v) {active = v; return this;} private boolean active = true;
public GfuiStatusBox VisibilityDuration_(int v) {timer.Interval_(v); visibilityDuration = v; return this;} int visibilityDuration;
@Override public void Opened_cbk() {
super.Opened_cbk();
UsrDlg_._.Reg(UsrMsgWkr_.Type_Note, this);
}
public void ExecUsrMsg(int type, UsrMsg umsg) {
if ( !active
|| !this.OwnerElem().Visible() // WORKAROUND.WINFORMS: else application hangs on Invoke
|| !this.Opened_done()
) return;
this.CreateControlIfNeeded(); // WORKAROUND.WINFORMS: else will sometimes throw: Cannot call Invoke or InvokeAsync on a control until the window handle has been created
this.VisibilityDuration_(umsg.VisibilityDuration());
String text = String_.Replace(umsg.XtoStr(), Op_sys.Cur().Nl_str(), " "); // replace NewLine with " " since TextBox cannot show NewLine
Invoke(GfoInvkAbleCmd.arg_(this, Invk_WriteText, text));
}
public void WriteText(String text) {
if (!this.Visible()) {
this.Visible_set(true);
this.Zorder_front();
}
this.Text_(text);
timer.Enabled_off().Enabled_on(); // Enabled_off().Enabled_on() resets timer; timer can be at second 1 of 3, and this will reset back to timer 0
GfuiEnv_.DoEvents(); // WORKAROUND.WINFORMS: needed, else text will not refresh (ex: splash screen); NOTE!!: will cause other timers to fire! (ex: mediaPlaylistMgr)
}
@Override public void Focus() {
this.Focus_able_(true);
super.Focus();
this.Focus_able_(false);
}
@Override public boolean DisposeCbk() {
super.DisposeCbk();
timer.Rls();
UsrDlg_._.RegOff(UsrMsgWkr_.Type_Note, this);
if (timerCmd != null) timerCmd.Rls();
return true;
}
void HideWindow() {
timer.Enabled_off();
Text_("");
this.Visible_set(false);
this.Zorder_back();
}
@Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_HideWindow)) HideWindow();
else if (ctx.Match(k, Invk_Text_empty)) {timer.Enabled_off(); Text_(GfuiTextBox_.NewLine + Text());}
else if (ctx.Match(k, Invk_WriteText)) WriteText(m.ReadStr("v"));
else return super.Invk(ctx, ikey, k, m);
return this;
} static final String Invk_HideWindow = "HideWindow", Invk_WriteText = "WriteText", Invk_Text_empty = "Text_empty";
TimerAdp timer;
@Override public void ctor_GfuiBox_base(KeyValHash ctorArgs) {
super.ctor_GfuiBox_base(ctorArgs);
this.Border_on_(false);
this.Focus_able_(false);
this.Visible_set(false);
timer = TimerAdp.new_(this, Invk_HideWindow, 2000, false);
}
@Override public void ctor_kit_GfuiElemBase(Gfui_kit kit, String key, GxwElem underElem, KeyValHash ctorArgs) {
super.ctor_kit_GfuiElemBase(kit, key, underElem, ctorArgs);
this.Border_on_(false);
this.Focus_able_(false);
this.Visible_set(true);
timerCmd = kit.New_cmd_sync(this);
timer = TimerAdp.new_(timerCmd, GfuiInvkCmd_.Invk_sync, 2000, false);
} GfuiInvkCmd timerCmd;
public void ctor_kit_GfuiElemBase_drd(Gfui_kit kit, String key, GxwElem underElem, KeyValHash ctorArgs) {
super.ctor_kit_GfuiElemBase(kit, key, underElem, ctorArgs);
this.Border_on_(false);
this.Focus_able_(false);
this.Visible_set(true);
timerCmd = kit.New_cmd_sync(this);
// timer = TimerAdp.new_(timerCmd, GfuiInvkCmd_.Invk_sync, 2000, false);
}
}
class GfuiStatusBox_ {
public static GfuiStatusBox new_(String key) {
GfuiStatusBox rv = new GfuiStatusBox();
rv.ctor_GfuiBox_base(GfuiElem_.init_focusAble_false_());
rv.Key_of_GfuiElem_(key);
return rv;
}
public static GfuiStatusBox kit_(Gfui_kit kit, String key, GxwElem underElem) {
GfuiStatusBox rv = new GfuiStatusBox();
rv.ctor_kit_GfuiElemBase(kit, key, underElem, GfuiElem_.init_focusAble_false_());
return rv;
}
}

View File

@@ -0,0 +1,39 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.gfui; import gplx.*;
public class GfuiStatusBoxBnd implements GfoInvkAble {
public GfuiStatusBox Box() {return statusBox;} GfuiStatusBox statusBox = GfuiStatusBox_.new_("statusBox");
void ShowTime() {
statusBox.ExecUsrMsg(UsrMsgWkr_.Type_Note, UsrMsg.new_(DateAdp_.Now().XtoStr_gplx_long()));
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_ShowTime)) ShowTime();
else return GfoInvkAble_.Rv_unhandled;
return this;
} public static final String Invk_ShowTime = "ShowTime";
public static GfuiStatusBoxBnd gft_(GfuiWin owner) {
GfuiStatusBoxBnd rv = new GfuiStatusBoxBnd();
rv.ctor_GfuiStatusBoxBnd(owner);
return rv;
}
void ctor_GfuiStatusBoxBnd(GfuiWin win) {
IptBnd_.cmd_to_(IptCfg_.Null, win, this, GfuiStatusBoxBnd.Invk_ShowTime, IptKey_.add_(IptKey_.Ctrl, IptKey_.Shift, IptKey_.T));
statusBox.Owner_(win).Visible_off_().BackColor_(ColorAdp_.Black).TextAlignH_right_().ForeColor_(ColorAdp_.Green);
win.Lyt().SubLyts().Add(GftGrid.new_().Bands_dir_(DirInt.Bwd).Bands_add(GftBand.new_().Cells_num_(1).Len1_abs_(13)));
}
}